/*
*
*
*     文档创建：jjl, jjl@hzncc.com
*  检验usb 寄存器偏移是否正确
*/

#include <stdio.h>
#include <stdint.h>

//USB 寄存器结构
struct usb {
	volatile uint32_t usb_top		;	//0x0000 usb top寄存器
	volatile uint32_t usb_int_state	;	//0x0004 usb中断状态寄存器
	volatile uint32_t ep_int_state	;	//0x0008 usb端点中断状态寄存器
	volatile uint32_t ep0_int_state	;	//0x000c usb端点0中断状态寄存器
	volatile uint32_t usb_int_en	;	//0x0010 usb中断使能寄存器
	volatile uint32_t ep_int_en		;	//0x0014 usb端点中断使能寄存器
	volatile uint32_t ep0_int_en	;	//0x0018 usb端点0中断使能寄存器
	volatile uint32_t usb_resv0		;	//0x001c 保留
	volatile uint32_t epx_int_state[8]	;	//0x0020 - 0x002c 端点x的中断状态，前四个有效
	volatile uint32_t epx_int_en[8]	;	//0x0040 - 0x004c 端点x的中断使能，前四个有效
	volatile uint32_t usb_addr		;	//0x0060 usb地址寄存器
	volatile uint32_t ep_en			;	//0x0064 usb端点使能寄存器
	volatile uint32_t usb_resv1[4]	;	//0x0068 保留寄存器
	volatile uint32_t tog_ctrl1_4	;	//0x0078 usb地址寄存器
	volatile uint32_t usb_resv2		;	//0x007c 保留寄存器
	volatile uint32_t setupx[8]		;	//0x0080 - 0x009c usb传输数据包寄存器
	volatile uint32_t pkt_size[2]	;	//0x00a0 - 0x00a4 usb传输包大小寄存器
	volatile uint32_t usb_resv3[22]	;	//0x00a8 - 0x00fc usb保留寄存器
	volatile uint32_t epx_avail[5]	;	//0x0100 - 0x0110 端点x有效数据寄存器
	volatile uint32_t usb_resv4[11]	;	//0x0114 - 0x013c usb保留寄存器
	volatile uint32_t epx_ctrl[5]	;	//0x0140 - 0x0150 usb端点x控制寄存器
	volatile uint32_t usb_resv5[3]	;	//0x0154 - 0x015c usb 保留寄存器
	volatile uint32_t epx_fifo[5]	;	//0x0160 - 0x0170 usb 端点x fifo寄存器
	volatile uint32_t usb_resv6[4]	;	//0x0174 - 0x0180 usb 保留寄存器
	volatile uint32_t ep_dma		;	//0x0184 usb 端点DMA使能寄存器
	volatile uint32_t ep_halt		;	//0x0188 usb端点暂停寄存器
	volatile uint32_t usb_resv7[13]	;	//0x018c - 0x01bc
	volatile uint32_t usb_power		;	//0x01c0 usb功耗控制寄存器
};

int main(int argc, char **argv)
{
	struct usb usb_var;

	uint32_t *refp = &usb_var.usb_top;
	uint32_t *p;
	
	p = usb_var.epx_int_state;
	printf("epx_int_state 地址应该是:0x0020 - 0x002c 实际地址起始:0x%x\n",(int)p - (int)refp);

	p = usb_var.epx_int_en;
	printf("epx_int_en 地址应该是:0x0040 - 0x004c 实际地址起始:0x%x\n",(int)p - (int)refp);


	p = &usb_var.ep_en;
	printf("ep_en 地址应该是:0x0064  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = &usb_var.tog_ctrl1_4;
	printf("tog_ctrl1_4 地址应该是:0x0078  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = usb_var.pkt_size;
	printf("pkt_size 地址应该是:0x00a0  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = usb_var.epx_avail;
	printf("epx_avail 地址应该是:0x0100  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = usb_var.epx_fifo;
	printf("epx_fifo 地址应该是:0x0160  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = &usb_var.ep_dma;
	printf("ep_dma 地址应该是:0x0184  实际地址起始:0x%x\n",(int)p - (int)refp);

	p = &usb_var.usb_power;
	printf("usb_power 地址应该是:0x01c0  实际地址起始:0x%x\n",(int)p - (int)refp);


	return 0;
}
